from PIL import Image
import numpy as np
import random

class find_pic:
    def __init__(self,img1,img2):
        #   先将路径转为图片    后将图片转化为数组        图片名称【y坐标】【x坐标】【R、G、B】
        self.img1 = Image.open(img1)                  # 图片1
        self.img2 = Image.open(img2)                  # 图片2   需要寻找的图片
        self.w, self.h = self.img1.size      #  图片1  宽高
        self.w2, self.h2 = self.img2.size    #  图片2   宽高
        self.x, self.y = 0, 0  #  图片2 在 图片1 的坐标

    def pic_find_xy_RGB(self):      # 查找图片上左上角的一点       小图推荐！     【百次寻图 平均时长 0.5.75S】  图片1【1920*1080】图片2【680*672】
        img1, img2 = np.array(self.img1), np.array(self.img2)                   # 将图片转化为数组  y坐标 x坐标 RGB
        a, b = random.randint(1, self.w2 - 1), random.randint(1, self.h2 - 1)   # 生成一个随机坐标，用于二次判断
        for x in range(0,self.w - self.w2):                                    # 生成一个坐标
            for y in range(0,self.h - self.h2):
                if img1[y][x][0] == img2[0][0][0] and img1[y][x][1] == img2[0][0][1] and img1[y][x][2] == img2[0][0][2]:  # 一次判断 取找图左上角坐标
                    if img1[y + b][x + a][0] == img2[b][a][0] and img1[y + b][x + a][1] == img2[b][a][1] and img1[y + b][x + a][2] == img2[b][a][2]: #二次判断
                        i, num = 0, 0
                        while True:        # 进行 10 次位图随机选点对比，如果 全部匹配 则返回成功！
                            x2, y2 = random.randint(1, self.w2 - 1), random.randint(1, self.h2 - 1)
                            if img1[y + y2][x + x2][0] == img2[y2][x2][0] and img1[y + y2][x + x2][1] == img2[y2][x2][1] and img1[y + y2][x + x2][2] == img2[y2][x2][2]:
                                i += 1
                            num += 1
                            if num > 10:
                                break           # 如果匹配失败重新进入循环
                            elif i >= 10:
                                self.x = x
                                self.y = y
                                return#  匹配成功返回数值

    #   获取图片匹配的坐标           # 灰度搜索，实验功能！      大图推荐！          【百次寻图 平均时长 0.492S】
    def pic_find_xy_Gray(self):
        img1, img2 = np.array(self.img1.convert('L')), np.array(self.img2.convert('L'))     # 将图片转化为数组  y坐标 x坐标
        for x in range(0,self.w - self.w2):                                                 # 生成坐标
            for y in range(0,self.h - self.h2):
                if img1[y][x] == img2[0][0]:                                                # 一次判断
                                                                                            # 二次判断，取 左上 右上 左下 右下 4个角落进行校准
                    if img1[y][x + self.w2 - 1] == img2[0][self.w2 - 1] and img1[y + self.h2 - 1][0] == img2[self.h2 - 1][0] and img1[y + self.h2 - 1][x + self.w2 - 1] == img2[self.h2 - 1][self.w2 - 1]:
                        i, num = 0, 0
                        while True:  # 进行 10 次位图随机选点对比，如果 全部匹配 则返回成功！
                            x2, y2 = random.randint(1, self.w2 - 1), random.randint(1, self.h2 - 1)
                            if img1[y + y2][x + x2] == img2[y2][x2]:
                                i += 1
                            num += 1
                            if num > 10:
                                break  # 如果匹配失败重新进入循环
                            elif i >= 10:
                                self.x = x
                                self.y = y
                                return# 匹配成功返回数值

    #   获取该坐标匹配图片的百分比
    def pic_percent(self, percent = 100):
        #   如果上面没有搜索出 x, y 的坐标，则直接返回相似度 0%
        if self.x == -1 and self.y == -1:
            return 0
        x, y, w, h = self.x, self.y, self.w2 ,self.h2
        all = w * h * percent / 100
        num = 0
        img1, img2 = np.array(self.img1), np.array(self.img2)
        for a in range(w):
            for b in range(h):
                if img1[b + y][a + x][0] == img2[b][a][0]:  # 判断RGB是否相同
                    if img1[b + y][a + x][1] == img2[b][a][1] and img1[b + y][a + x][2] == img2[b][a][2]:
                        num = num + 1
                        if num > all:
                            return percent
        return (round(num / all * 100, 2))